using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using T.FAS.Runtime.Base.Entity;
using T.FAS.Runtime.Metadata.Entity.DataModel;
using T.FAS.Runtime.DataAccess.Common;

namespace T.FAS.Runtime.DataAccess.Engine
{
    /// <summary>
    /// 元素对应的字段值转换器
    /// </summary>
    /// <remarks>元素对应的字段值转换器</remarks>
    class ElementValueWrapper
    {
        /// <summary>
        /// 转化元素对应字段的值。将日期的值转化成相应的格式字符串。
        /// </summary>
        /// <param name="element">元素。</param>
        /// <param name="elementValue">元素对应字段的值。</param>
        /// <returns>转化后的值。</returns>
        public static object ConvertElementValue(CompositeNodeObjectElement element, object elementValue)
        {
            if (element == null)
                throw new FasException(DataAccessErrorCode.NullValue, CommonStringClassEngine.ElementValueWrapper_ConvertElementValue);

            switch (element.DataType)
            {
                case DataType.Date:
                    // 系统的短日期格式。兼容以前的日期格式。
                    if (elementValue == null || string.IsNullOrEmpty(Convert.ToString(elementValue)) ||
                        (Convert.ToDateTime(elementValue) == new DateTime()))
                    {
                        return DBNull.Value;
                    }
                    //return DateTimeToStringByCHAR8(Convert.ToDateTime(elementValue));
                    if(elementValue is DateTime dtVal)
                    {
                        return dtVal.TruncateFromDate();
                    }
                    else
                    {
                        return DateTimeToStringByCHAR8(Convert.ToDateTime(elementValue));
                    }
                case DataType.DateTime:
                    if (elementValue == null || string.IsNullOrEmpty(Convert.ToString(elementValue)) ||
                        (Convert.ToDateTime(elementValue) == new DateTime()))
                        return DBNull.Value;
                    return elementValue;
                case DataType.Time:
                    if (elementValue == null || string.IsNullOrEmpty(Convert.ToString(elementValue)))
                        return DBNull.Value;
                    return elementValue;
                case DataType.Binary:
                    byte[] byteAry = elementValue as byte[];
                    if ((byteAry != null) && (byteAry.Length == 0))
                        return DBNull.Value;
                    return elementValue;
                default:
                    return elementValue;
            }
        }

        /// <summary>
        /// 将日期数据转换为CHAR8格式字符串。
        /// </summary>
        /// <param name="dt">日期数据。</param>
        /// <returns>日期数据的CHAR8格式字符串。</returns>
        public static string DateTimeToStringByCHAR8(DateTime dt)
        {
            string formatStringCHAR8 = "yyyy-MM-dd";
            return dt.ToString(formatStringCHAR8);
        }
         

        ///// <summary>
        ///// 将日期数据转换为ISO8601格式字符串。
        ///// </summary>
        ///// <param name="dt">日期数据。</param>
        ///// <returns>日期数据的ISO8601格式字符串。</returns>
        //public static string DateTimeToStringByISO8601(DateTime dt)
        //{
        //    string formatStringISO8601 = "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz";
        //    return dt.ToString(formatStringISO8601, System.Globalization.DateTimeFormatInfo.InvariantInfo);
        //}

        ///// <summary>
        ///// 获取ElementDataType对应的C#中的数据类型
        ///// </summary>
        ///// <param name="element">节点元素</param>
        ///// <returns>ElementDataType对应的C#中的数据类型</returns>
        //public static Type GetType(CompositeNodeObjectElement element)
        //{
        //    if (element == null)
        //        throw new ArgumentNullException("ElementValueWrapper.GetType.CompositeNodeObjectElement");
        //    switch (element.DataType)
        //    {
        //        case DataType.String:                
        //            return typeof(string);
        //        case DataType.Boolean:
        //        case DataType.Int:
        //            return typeof(int);
        //        case DataType.Long:
        //            return typeof(long);
        //        case DataType.Decimal:
        //            return typeof(decimal);
        //        case DataType.Date:
        //        case DataType.Timestamp:
        //        case DataType.DateTime:
        //            return typeof(DateTime);
        //        case DataType.Time:
        //            return typeof(TimeSpan);
        //        case DataType.Binary:
        //            return typeof(byte[]);
        //        default:
        //            throw new NotSupportedException(element.DataType.ToString());
        //    }
        //}

        ///// <summary>
        ///// 获取ElementDataType对应的C#中的数据类型
        ///// </summary>
        ///// <param name="element">节点元素</param>
        ///// <returns>ElementDataType对应的C#中的数据类型</returns>
        //public static Type GetType(DataType dataType)
        //{
        //    switch (dataType)
        //    {
        //        case DataType.String:                
        //            return typeof(string);
        //        case DataType.Boolean:
        //        case DataType.Int:
        //            return typeof(int);
        //        case DataType.Decimal:
        //            return typeof(decimal);
        //        case DataType.Date:
        //        case DataType.DateTime:
        //            return typeof(DateTime);
        //        case DataType.Binary:
        //            return typeof(byte[]);
        //        default:
        //            throw new NotSupportedException(dataType.ToString());
        //    }
        //}

        #region 方法

        #endregion
    }
}
